package main

import (
	"fmt"
	"knowledge-go/cpt/c_000_com"
)

/*
函数数独立的，只与package绑定，而方法是和type绑定在一起的，可以认为是type内部的函数
在函数声明时，在其名字之前放上一个变量，即是一个方法。这个附加的参数会将该函数附加到这种类型上，即相当于为这种类型定义了一个独占的方法
*/
func main() {
	// 1.方法定义
	user := c_000_com.User{Id: 1, Name: "张三"}
	fmt.Println("公共函数", c_000_com.GetUserName(user))
	// user.XXX  这种语法叫做选择器
	fmt.Println("user内部方法", user.GetUserName())

	// 2.方法重载
	us := c_000_com.Users{
		c_000_com.User{Id: 1, Name: "张三"},
		c_000_com.User{Id: 2, Name: "李四"},
	}
	usName := us.GetUserName()
	fmt.Println("所有user的name", usName)

	fmt.Println("##########################################")

	// 3.修改对象数据
	fmt.Println("【主方法】中的user内存地址", c_000_com.GetStructAddress(&user), user)
	user.SetUserName1("zhangsan")
	fmt.Println("【主方法】修改后的地址1", c_000_com.GetStructAddress(&user), user)
	(&user).SetUserName2("zhangsan")
	fmt.Println("【主方法】修改后的地址2", c_000_com.GetStructAddress(&user), user)

}
